import Point = require('./Point');
export = PointPath;

/**
 * 路径
 * @author jackliu
 *
 */
class PointPath {
    
    // 包含多个点
    public points:Array<Point> = new Array<Point>();// 二维数组，每个点是一个数组
    public w:number = 0;
    public h:number = 0;
    
	public constructor() {
	}
	
    // 转成json字符串
    // 将多个点用数组表示，不需要按对象转，可以节省空间
    // 按以下方式储存可以节省75%的空间:
    //		{	"points":[	[0,0,1],
    //			[1,1,1],
    //			[2,2,1]],
    //			"w":100,
    //			"h":200}
    public toJson():string {
        var ret = '{';
        var pts = '[';
        if (this.points.length > 0) {
            for (var i = 0; i < this.points.length; i++) {
                pts += this.points[i].toArray();
                pts += ','
            }
            pts = pts.substr(0, pts.length - 1);// 去除多余的逗号
        }
        pts += ']';
        
        ret += ('"points":' + pts);
        ret += ',';
        ret += ('"w":' + this.w);
        ret += ',';
        ret += ('"h":' + this.h);
        ret += '}';
        return ret;
    }
    // 从json对象中解析出PointPath
    public fromJson (jsonObj, versionId) {
        var pts = jsonObj.points;
        this.w = jsonObj.w*1;
        this.h = jsonObj.h*1;
        this.points.splice(0, this.points.length);
        for (var i = 0; i < pts.length; i++) {
            var newPt = new Point();
            if(pts[i] instanceof Array) {
                newPt.fromArray(pts[i]);
            } else {
                newPt.fromJson(pts[i],versionId);
            }
            this.points.push(newPt);
        }
        
    }
    // 调整简单路径，平移或者缩放
    // 参数
    //		charContour:复合路径
    //		vW:水平方向的平移值或者缩放值
    //		vH:垂直方向的平移值或者缩放值
    // 		type:类型，1 平移  2 缩放
    public adjustPosition(vW, vH, type) {
        if (this.points.length == 0)
            return;
        if (2 == type) {
            this.w *= vW;
            this.h *= vH;
        }
        
        for (var l = 0; l < this.points.length; l++) {
            var pt = this.points[l];
            if (type == 1) {
                pt.x += vW;
                pt.y += vH;
            } else if (type == 2) {
                pt.x *= vW;
                pt.y *= vH;
            }
        }
        return;
    }
    // 求长度［暂时不处理bezier曲线］
    public length():number{
        var len: number=0;
        for(var l=1;l<this.points.length;l++) {
            var pt0=this.points[l-1];
            var pt1=this.points[l];
            len+=pt0.distance(pt1);
            
        }
        return len;
    }
    // 求长度对应的点［暂时不处理bezier曲线］
    public ptInLength(length:number):Point{
        var len: number=0;
        for(var l=1;l<this.points.length;l++) {
            var pt0=this.points[l-1];
            var pt1=this.points[l];
            len+=pt0.distance(pt1);
            if(len> (length-0.1)){
                return pt1;           
            }
        }
        return null;
    }
    
    /**
 * 参数：
 *      offsetX，offsetY （可选参数） 偏移量
 *      fixed 小数点后保留几位
 * 转换成SVG格式的字符串：
 *      'M 0,20 L 100,160 Q 130,200 150,120 C 190,-40 200,200 300,150 L 400,90 z',
 * 其中：
 *      M   MoveTo
 *      L   LineTo
 *      Q   Quadratic
 *      C   Cubic
 *      z   closepath
 */
    public toSvgPath(offsetX=0,offsetY=0,fixed=0) {
        offsetX=(offsetX==null)? 0:offsetX;
        offsetY=(offsetY==null)? 0:offsetY;

        var svg="";
        var closeMark=false;
        for(var i=0;i<this.points.length;i++) {
            var pt=this.points[i];

            switch(pt.type) {
                case Point.POD_TT_PRIM_MOVE:
                    svg+=("M "+(pt.x+offsetX).toFixed(fixed)+','+(pt.y+offsetY).toFixed(fixed)+' ');
                    break;
                case Point.POD_TT_PRIM_LINE:
                    svg+=("L "+(pt.x+offsetX).toFixed(fixed)+','+(pt.y+offsetY).toFixed(fixed)+' ');
                    break;
                case Point.POD_TT_PRIM_QSPLINE:
                    svg+=("Q "+(pt.x+offsetX).toFixed(fixed)+','+(pt.y+offsetY).toFixed(fixed)+' ');
                    var ptN=this.points[i+1];
                    svg+=((ptN.x+offsetX).toFixed(fixed)+','+(ptN.y+offsetY).toFixed(fixed)+' ');
                    i++;
                    break;
                case Point.POD_TT_PRIM_CSPLINE:
                    svg+=("C "+(pt.x+offsetX).toFixed(fixed)+','+(pt.y+offsetY).toFixed(fixed)+' ');
                    var ptN=this.points[i+1];
                    svg+=((ptN.x+offsetX).toFixed(fixed)+','+(ptN.y+offsetY).toFixed(fixed)+' ');
                    var ptNN=this.points[i+2];
                    svg+=((ptNN.x+offsetX).toFixed(fixed)+','+(ptNN.y+offsetY).toFixed(fixed)+' ');
                    i+=2;
                    break;
                case Point.POD_TT_PRIM_CLOSE:
                    svg+=("z ");
                    closeMark=true;
                    break;
                default:
                    break;
            }

        }
        // 检测是否为闭合路径
        if(!closeMark&&(this.points.length>2)) {
            var tolerance=0.05;
            if(Math.abs(this.points[0].x-this.points[this.points.length-1].x)<tolerance
                &&Math.abs(this.points[0].y-this.points[this.points.length-1].y)<tolerance)
                svg+='z';
        }
        return svg;
    }
    
//SJG_MARK_APPEND--------------------


}//SJG_MARK_END-------------------------